home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
The World of Computer Software.iso
/
newmarch.zip
/
CALENDAR.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-08
|
19KB
|
711 lines
/* Author: $Author: jan $
* File: $Source: /usr/usrs/jan/desktop/X_Book.boo/programs/RCS/calendar.c,v $
* Date: $Date: 1992/09/09 00:09:47 $
* Revision: $Revision: 1.1 $
*/
#include "copyright.h"
/*-----------------------------------------------------
** Include Files
*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <Xm/BulletinB.h>
#include <Xm/CascadeB.h>
#include <Xm/DialogS.h>
#include <Xm/Form.h>
#include <Xm/Label.h>
#include <Xm/MainW.h>
#include <Xm/MessageB.h>
#include <Xm/PushB.h>
#include <Xm/RowColumn.h>
#include <Xm/ScrolledW.h>
#include <Xm/Text.h>
#include <Xm/SelectioB.h>
/* Motif version number */
#if XmVersion == 1000
#define MOTIF_1_0
#endif
/*-----------------------------------------------------
** Forward Declarations
*/
void main ();
void CreateApplication ();
Widget CreateHelp ();
Widget CreateMenu();
Widget CreateCalendar();
Widget CreatePopupEditor();
char *ReadFile ();
/* Close popup help callback */
void CloseCB ();
/* Help callbacks */
void AboutHelpCB ();
void ApplicHelpCB ();
void EditHelpCB ();
/* Editor callbacks */
void EditDayCB ();
void EditCancelCB();
void EditExitCB ();
void EditSaveCB ();
void EditChangedCB ();
/* Exiting application with
unsaved files callbacks
*/
void ExitSaveCB();
void ExitDontSaveCB();
void ExitAnywayCB();
void QuitCB ();
/* File menu callbacks */
void FileSaveCB ();
void FileExitCB ();
/*-----------------------------------------------------
** Global Variables
*/
#define MAX_ARGS 20
#define Class_name "XmCalendar"
Arg args[MAX_ARGS];
Widget popups[29];
char *text[29];
Bool text_saved[29];
char * daylabels[] = {"Mon", "Tue", "Wed", "Thu", "Fri",
"Sat", "Sun"};
/* Help texts */
char APPLIC_HELP_TEXT[] =
"Click on a day to see or \n\
edit messages for that day";
char ABOUT_HELP_TEXT[] =
"XmCalendar - version 1.0 \n\
J.D. Newmarch";
char EDIT_HELP_TEXT[] =
"A simple editor";
/*-----------------------------------------------------
** main - main logic for application
*/
void main (argc,argv)
unsigned int argc;
char **argv;
{
Display *display; /* Display */
Widget app_shell; /* ApplicationShell */
app_shell = XtInitialize(NULL,
Class_name, /* class name */
NULL, /* options */
0, /* number of options */
&argc, argv);
/* Create and realize main application window.
*/
CreateApplication (app_shell);
XtRealizeWidget (app_shell);
/* Get and dispatch events.
*/
XtMainLoop ();
}
/*-----------------------------------------------------
** CreateApplication - create main window
*/
void CreateApplication (parent)
Widget parent;
{
Widget main_window;
Widget menu;
Widget calendar;
register int n;
XmString label_string;
/* Create MainWindow
*/
n = 0;
main_window = XmCreateMainWindow (parent, "main1",
args, n);
XtManageChild (main_window);
menu = CreateMenu(main_window);
calendar = CreateCalendar(main_window);
XmMainWindowSetAreas (main_window,
menu, /* menu bar */
NULL, /* command */
NULL, /* horizon scroll bar */
NULL, /* vert scroll bar */
calendar); /* work area */
}
Widget CreateMenu(parent)
Widget parent;
{
Widget menu_bar;
Widget menu_pane;
Widget cascade;
Widget button;
int n; /* Create MenuBar in MainWindow.
*/
n = 0;
menu_bar = XmCreateMenuBar (parent, "menu_bar",
args, n);
XtManageChild (menu_bar);
/* Create "File" PulldownMenu.
*/
n = 0;
menu_pane = XmCreatePulldownMenu (menu_bar,
"menu_pane", args, n);
n = 0;
button = XmCreatePushButton (menu_pane, "Save",
args, n);
XtManageChild (button);
XtAddCallback (button, XmNactivateCallback,
FileSaveCB, NULL);
n = 0;
button = XmCreatePushButton (menu_pane, "Exit",
args, n);
XtManageChild (button);
XtAddCallback (button, XmNactivateCallback,
FileExitCB, (caddr_t) 1);
n = 0;
XtSetArg (args[n], XmNsubMenuId, menu_pane); n++;
cascade = XmCreateCascadeButton (menu_bar, "File",
args, n);
XtManageChild (cascade);
/* Create "Help" PulldownMenu
*/
n = 0;
menu_pane = XmCreatePulldownMenu (menu_bar,
"menu_pane", args, n);
n = 0;
button = XmCreatePushButton (menu_pane, "About",
args, n);
XtManageChild (button);
XtAddCallback (button, XmNactivateCallback,
AboutHelpCB, NULL);
n = 0;
button = XmCreatePushButton (menu_pane,
"Application", args, n);
XtManageChild (button);
XtAddCallback (button, XmNactivateCallback,
ApplicHelpCB, NULL);
n = 0;
XtSetArg (args[n], XmNsubMenuId, menu_pane); n++;
cascade = XmCreateCascadeButton (menu_bar, "Help",
args, n);
XtManageChild (cascade);
n = 0;
XtSetArg (args[n], XmNmenuHelpWidget,
cascade); n++;
XtSetValues (menu_bar, args, n);
return (menu_bar);
}
Widget
CreateCalendar(parent)
Widget parent;
{ Widget rowcol;
Widget label;
Widget button;
int day, n;
char daystr[4];
n = 0;
XtSetArg (args[n], XmNpacking, XmPACK_COLUMN); n++;
XtSetArg (args[n], XmNorientation,
XmHORIZONTAL); n++;
XtSetArg (args[n], XmNnumColumns, 5); n++;
rowcol = XmCreateRowColumn(parent, "row col",
args, n);
XtManageChild (rowcol);
for (day = 0; day < 7; day++)
{
n = 0;
label = XmCreateLabel (rowcol, daylabels[day],
args, n);
XtManageChild (label);
}
for (day = 1; day <= 28; day++)
{ popups[day] = CreatePopupEditor (rowcol,
day);
text_saved[day] = True;
sprintf (daystr, "%d", day);
n = 0;
XtSetArg (args[n], XmNlabelString, NULL);
button = XmCreatePushButton (rowcol, daystr,
args, n);
XtAddCallback(button, XmNactivateCallback,
EditDayCB, popups[day]);
XtManageChild (button);
}
return (rowcol);
}
/*---------------------------------------------------
** CreateHelp - create help window
*/
Widget CreateHelp (parent, help_text, title_text)
Widget parent;
char *help_text;
char *title_text;
{
Widget button;
Widget message_box;
Arg args[MAX_ARGS];
register int n;
XmString title_string = NULL;
XmString message_string = NULL;
XmString button_string = NULL;
/* Generate message to display.
*/
message_string = XmStringCreateLtoR (help_text,
XmSTRING_DEFAULT_CHARSET);
button_string = XmStringCreateLtoR ("Close",
XmSTRING_DEFAULT_CHARSET);
title_string = XmStringCreateLtoR (title_text,
XmSTRING_DEFAULT_CHARSET);
/* Create MessageBox dialog.
*/
n = 0;
XtSetArg (args[n], XmNdialogTitle,
title_string); n++;
XtSetArg (args[n], XmNokLabelString,
button_string); n++;
XtSetArg (args[n], XmNmessageString,
message_string); n++;
message_box = XmCreateMessageDialog (parent,
"helpbox", args, n);
XtAddCallback (message_box, XmNokCallback, CloseCB, NULL);
button = XmMessageBoxGetChild (message_box,
XmDIALOG_CANCEL_BUTTON);
XtUnmanageChild (button);
button = XmMessageBoxGetChild (message_box,
XmDIALOG_HELP_BUTTON);
XtUnmanageChild (button);
/* Free strings and return MessageBox.
*/
XmStringFree (title_string);
XmStringFree (message_string);
XmStringFree (button_string);
return (message_box);
}
/*----------------------------------------------------
** CloseCB - callback for close button
*/
void
CloseCB (w, client_data, call_data)
Widget w; /* widget id */
caddr_t client_data; /* font pointer */
caddr_t call_data; /* data from widget class */
{ /* Unmanage widgets.
*/
XtUnmanageChild (w);
XtDestroyWidget (XtParent (w));
}
#ifdef MOTIF_1_0
/* to fix a "feature" of a bulletin board in a dialog */
char transLine[] = "<Key>Return: newline()";
#endif
Widget
CreatePopupEditor (parent, day)
Widget parent;
int day;
{
Widget edit_message_box;
Widget edit_dialog;
Widget edit_text;
int n;
#ifdef MOTIF_1_0
XtTranslations transTable;
#endif
char daystr[4];
sprintf (daystr, "%d", day);
/* create the display window with a text widget as
** a popup window
*/
n = 0;
XtSetArg (args[n], XmNselectionLabelString,
XmStringCreateLtoR ("",
XmSTRING_DEFAULT_CHARSET));
n++;
XtSetArg(args[n], XmNautoUnmanage, False); n++;
edit_dialog = XmCreatePromptDialog(parent,
daystr, args, n);
XtUnmanageChild (XmSelectionBoxGetChild (
edit_dialog,
XmDIALOG_TEXT));
XtManageChild (XmSelectionBoxGetChild (edit_dialog,
XmDIALOG_APPLY_BUTTON));
/* Add callbacks for each button.
The day value is passed in as client data.
Note the type cast of int to pointer for this
*/
XtAddCallback(edit_dialog, XmNapplyCallback,
EditSaveCB, (caddr_t) day);
XtAddCallback(edit_dialog, XmNcancelCallback,
EditCancelCB, (caddr_t) day);
XtAddCallback(edit_dialog, XmNhelpCallback,
EditHelpCB, (caddr_t) day);
XtAddCallback(edit_dialog, XmNokCallback,
EditExitCB, (caddr_t) day);
n = 0;
XtSetArg (args[n], XmNtitle, daystr); n++;
XtSetValues (XtParent(edit_dialog), args, n);
n = 0;
XtSetArg(args[n], XmNeditMode,
XmMULTI_LINE_EDIT); n++;
edit_text = XmCreateScrolledText(edit_dialog,
"edit text", args, n);
XtAddCallback (edit_text, XmNvalueChangedCallback,
EditChangedCB, (caddr_t) day);
#ifdef MOTIF_1_0
/* edit_text is a child of a form in a dialog.
A form is a subclass of a bulletin board which
"redefines" the return key in this context.
Fix the return key back to what it should be: */
transTable = XtParseTranslationTable(transLine);
XtOverrideTranslations(edit_text, transTable);
#endif
text[day] = ReadFile(day);
XmTextSetString (edit_text, text[day]);
XtManageChild (edit_text);
return (edit_text);
}
/*
** Read the contents of the file into
** a string and return the string.
* Returns NULL on any failure (eg no file)
*/
char *
ReadFile(day)
int day;
{
char filename[4];
struct stat statbuf; /* File Info. */
int file_length; /* File Length */
char * file_string; /* File Contents */
FILE *fp = NULL; /* File Pointer */
int nread; sprintf (filename, "%d", day);
if ((fp = fopen(filename, "r+")) == NULL)
if ((fp = fopen(filename, "r")) != NULL)
{
fprintf(stderr,
"Warning: file opened read only.\n");
}
else
{
return((char *) NULL);
} if (stat(filename, &statbuf) == 0)
file_length = statbuf.st_size;
else
file_length = 1000; /* arbitrary file length */ /* read the file string */
file_string = (char *)
XtMalloc((unsigned)file_length + 1);
nread = fread(file_string, sizeof(char),
file_length, fp);
/* NULL terminate the string */
file_string[nread] = (char) 0;
/* close the file */
if (fclose(fp) != NULL)
fprintf(stderr,
"Warning: unable to close file.\n");
return (file_string);
}
/*----------------------------------------------------
** Callbacks for each of the three help buttons
*/
/*----------------------------------------------------
** ApplicHelpCB - callback for help button
*/
void
ApplicHelpCB (w, client_data, call_data)
Widget w;
caddr_t client_data;
caddr_t call_data;
{
Widget message_box;
/* Create help window.
*/
message_box = CreateHelp (w, APPLIC_HELP_TEXT,
"Application");
/* Display help window.
*/
XtManageChild (message_box);
}
/*-------------------------------------------------
** AboutHelpCB - callback for help button
*/
void
AboutHelpCB (w, client_data, call_data)
Widget w;
caddr_t client_data;
caddr_t call_data;
{
Widget message_box;
/* Create help window.
*/
message_box = CreateHelp (w, ABOUT_HELP_TEXT,
"About");
/* Display help window.
*/
XtManageChild (message_box);
}
/*-----------------------------------------------------
** EditHelpCB - callback for help button
*/
void
EditHelpCB (w, day, call_data)
Widget w;
caddr_t day;
caddr_t call_data;
{
Widget message_box;
/* Create help window.
*/
message_box = CreateHelp (w, EDIT_HELP_TEXT,
"Edit");
/* Display help window.
*/
XtManageChild (message_box);
}
void
SaveFile (day)
int day;
{ char filename[4];
FILE *fp = NULL;
/* free the old string and get the current text
*/
XtFree (text[day]);
text[day] = XmTextGetString (popups[day]);
sprintf (filename, "%d", day);
if ((fp = fopen (filename, "w")) == NULL)
{ fprintf (stderr,
"Can't open file %s for writing\n",
filename);
return;
}
fputs (text[day], fp);
if (fclose (fp) != NULL)
fprintf (stderr,
"Can't close file %s\n", filename);
else
text_saved[day] = True;
}
void
EditSaveCB(w, client_data, call_data)
Widget w;
caddr_t client_data;
caddr_t call_data;
{ int day; day = (int) client_data;
SaveFile (day);
}
void
EditCancelCB(w, client_data, call_data)
Widget w;
caddr_t client_data;
caddr_t call_data;
{ int day;
/* extract the day value, casting it
back to int from pointer
*/
day = (int) client_data;
/* restore text to last saved value
*/
XmTextSetString (popups[day], text[day]);
text_saved[day] = True;
}
void
EditExitCB(w, day, call_data)
Widget w;
caddr_t day;
caddr_t call_data;
{
XtUnmanageChild(w);
}
void
EditChangedCB(w, client_data, call_data)
Widget w;
caddr_t client_data;
caddr_t call_data;
{ int day = (int) client_data;
text_saved[day] = False;
}
/*
** Edit Day CB
*/
void
EditDayCB (w, editor, call_data)
Widget w; /* widget id */
Widget editor;
caddr_t call_data; /* data from widget class */
{
/* parent is the scroll bar, its parent the
unmanaged selection box
*/
XtManageChild (XtParent(XtParent(editor)));
}
/*-----------------------------------------------
** FileSaveCB - callback for quit button
*/
void
FileSaveCB (w, client_data, call_data)
Widget w;
caddr_t client_data;
caddr_t call_data;
{ int day;
for (day = 1; day <= 28; day++)
if ( ! text_saved[day])
SaveFile (day);
}
void
modal_dialog_loop (w, dialog_over)
Widget w;
Bool *dialog_over;
{ int n = 0;
XtSetArg (args[n], XmNdialogStyle,
XmDIALOG_FULL_APPLICATION_MODAL); n++;
XtSetValues (w, args, n);
XtManageChild (w);
while (*dialog_over == False)
XtProcessEvent (XtIMAll);
XtUnmanageChild (w);
XtDestroyWidget (XtParent (w));
}
void
ExitSaveCB(w, dialog_over, call_data)
Widget w;
Bool *dialog_over;
caddr_t call_data;
{ int day;
caddr_t data;
int n = 0;
/* find which day it is */
XtSetArg (args[n], XmNuserData, &data); n++;
XtGetValues (w, args, n);
/* convert back from pointer type */
day = (int) data;
SaveFile (day);
*dialog_over = True;
}
void
ExitDontSaveCB(w, dialog_over, call_data)
Widget w;
Bool *dialog_over;
caddr_t call_data;
{
*dialog_over = True;
}
void
ExitAnywayCB (w, client_data, call_data)
Widget w;
caddr_t client_data;
caddr_t call_data;
{
exit(0);
}
void
DayUnsaved (day)
int day;
{ Widget warn = NULL;
char message[512];
XmString xmmessage;
int n;
Bool dialog_over = False;
n = 0;
warn = XmCreateWarningDialog (popups[day],
"warning", args, n);
XtAddCallback (warn, XmNokCallback,
ExitSaveCB, &dialog_over);
XtAddCallback (warn, XmNcancelCallback,
ExitDontSaveCB, &dialog_over);
XtAddCallback (warn, XmNhelpCallback,
ExitAnywayCB, NULL);
sprintf (message, "Day %d\nnot saved", day);
xmmessage = XmStringCreateLtoR (message,
XmSTRING_DEFAULT_CHARSET);
n = 0;
XtSetArg (args[n], XmNmessageString,
xmmessage); n++;
/* store the day value in the widget's user data */
XtSetArg (args[n], XmNuserData, (caddr_t) day); n++;
XtSetValues (warn, args, n);
XtManageChild (warn);
XmStringFree (xmmessage);
/* make the dialog modal */
modal_dialog_loop (warn, &dialog_over);
}
/*---------------------------------------------------
** FileExitCB - callback for quit button
*/
void
FileExitCB (w, client_data, call_data)
Widget w;
caddr_t client_data;
caddr_t call_data;
{ int day;
/* modal dialogs to query about unsaved days */
for (day = 1; day <= 28; day++)
if ( !text_saved[day])
DayUnsaved(day);
exit (0);
}